From 67051d64f4f335e8a578602882e215a895614ea5 Mon Sep 17 00:00:00 2001 From: Kristian Rietveld Date: Tue, 12 Feb 2002 17:48:02 +0000 Subject: [PATCH] emit row_deleted before we start unreffing the nodes ourselves Tue Feb 12 14:27:41 2002 Kristian Rietveld * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit row_deleted before we start unreffing the nodes ourselves (gtk_tree_model_sort_increment_stamp): always increment the stamp, and not only if the stamp equals 0 (pointed out by Darin Adler) * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want to continue the while loop and not the nested for loop. --- ChangeLog | 10 ++++++++++ ChangeLog.pre-2-0 | 10 ++++++++++ ChangeLog.pre-2-10 | 10 ++++++++++ ChangeLog.pre-2-2 | 10 ++++++++++ ChangeLog.pre-2-4 | 10 ++++++++++ ChangeLog.pre-2-6 | 10 ++++++++++ ChangeLog.pre-2-8 | 10 ++++++++++ gtk/gtktreemodel.c | 12 ++++-------- gtk/gtktreemodelsort.c | 16 +++++++++++++--- 9 files changed, 87 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 68a397fd1b..7355b6e1ba 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +Tue Feb 12 14:27:41 2002 Kristian Rietveld + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit + row_deleted before we start unreffing the nodes ourselves + (gtk_tree_model_sort_increment_stamp): always increment the stamp, + and not only if the stamp equals 0 (pointed out by Darin Adler) + + * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want + to continue the while loop and not the nested for loop. + Tue Feb 12 02:19:49 2002 Tim Janik * gtk/gtktable.c (gtk_table_size_allocate_pass1): always spread out diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 68a397fd1b..7355b6e1ba 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,13 @@ +Tue Feb 12 14:27:41 2002 Kristian Rietveld + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit + row_deleted before we start unreffing the nodes ourselves + (gtk_tree_model_sort_increment_stamp): always increment the stamp, + and not only if the stamp equals 0 (pointed out by Darin Adler) + + * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want + to continue the while loop and not the nested for loop. + Tue Feb 12 02:19:49 2002 Tim Janik * gtk/gtktable.c (gtk_table_size_allocate_pass1): always spread out diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 68a397fd1b..7355b6e1ba 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,13 @@ +Tue Feb 12 14:27:41 2002 Kristian Rietveld + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit + row_deleted before we start unreffing the nodes ourselves + (gtk_tree_model_sort_increment_stamp): always increment the stamp, + and not only if the stamp equals 0 (pointed out by Darin Adler) + + * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want + to continue the while loop and not the nested for loop. + Tue Feb 12 02:19:49 2002 Tim Janik * gtk/gtktable.c (gtk_table_size_allocate_pass1): always spread out diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 68a397fd1b..7355b6e1ba 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,13 @@ +Tue Feb 12 14:27:41 2002 Kristian Rietveld + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit + row_deleted before we start unreffing the nodes ourselves + (gtk_tree_model_sort_increment_stamp): always increment the stamp, + and not only if the stamp equals 0 (pointed out by Darin Adler) + + * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want + to continue the while loop and not the nested for loop. + Tue Feb 12 02:19:49 2002 Tim Janik * gtk/gtktable.c (gtk_table_size_allocate_pass1): always spread out diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 68a397fd1b..7355b6e1ba 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,13 @@ +Tue Feb 12 14:27:41 2002 Kristian Rietveld + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit + row_deleted before we start unreffing the nodes ourselves + (gtk_tree_model_sort_increment_stamp): always increment the stamp, + and not only if the stamp equals 0 (pointed out by Darin Adler) + + * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want + to continue the while loop and not the nested for loop. + Tue Feb 12 02:19:49 2002 Tim Janik * gtk/gtktable.c (gtk_table_size_allocate_pass1): always spread out diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 68a397fd1b..7355b6e1ba 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,13 @@ +Tue Feb 12 14:27:41 2002 Kristian Rietveld + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit + row_deleted before we start unreffing the nodes ourselves + (gtk_tree_model_sort_increment_stamp): always increment the stamp, + and not only if the stamp equals 0 (pointed out by Darin Adler) + + * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want + to continue the while loop and not the nested for loop. + Tue Feb 12 02:19:49 2002 Tim Janik * gtk/gtktable.c (gtk_table_size_allocate_pass1): always spread out diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 68a397fd1b..7355b6e1ba 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,13 @@ +Tue Feb 12 14:27:41 2002 Kristian Rietveld + + * gtk/gtktreemodelsort.c (gtk_tree_model_sort_row_deleted): emit + row_deleted before we start unreffing the nodes ourselves + (gtk_tree_model_sort_increment_stamp): always increment the stamp, + and not only if the stamp equals 0 (pointed out by Darin Adler) + + * gtk/gtktreemodel.c (gtk_tree_row_ref_deleted_callback): we want + to continue the while loop and not the nested for loop. + Tue Feb 12 02:19:49 2002 Tim Janik * gtk/gtktable.c (gtk_table_size_allocate_pass1): always spread out diff --git a/gtk/gtktreemodel.c b/gtk/gtktreemodel.c index c8b858d389..5f161a2412 100644 --- a/gtk/gtktreemodel.c +++ b/gtk/gtktreemodel.c @@ -1334,17 +1334,11 @@ gtk_tree_row_ref_deleted_callback (GObject *object, gint i; if (path->depth > reference->path->depth) - { - tmp_list = g_slist_next (tmp_list); - continue; - } + goto next; for (i = 0; i < path->depth - 1; i++) { if (path->indices[i] != reference->path->indices[i]) - { - tmp_list = g_slist_next (tmp_list); - continue; - } + goto next; } /* We know it affects us. */ @@ -1359,6 +1353,8 @@ gtk_tree_row_ref_deleted_callback (GObject *object, reference->path->indices[path->depth-1]-=1; } } + +next: tmp_list = g_slist_next (tmp_list); } } diff --git a/gtk/gtktreemodelsort.c b/gtk/gtktreemodelsort.c index cc84fb5636..03d3adad45 100644 --- a/gtk/gtktreemodelsort.c +++ b/gtk/gtktreemodelsort.c @@ -693,6 +693,14 @@ gtk_tree_model_sort_row_deleted (GtkTreeModel *s_model, elt = SORT_ELT (iter.user_data2); offset = elt->offset; + /* we _need_ to emit ::row_deleted before we start unreffing the node + * itself. This is because of the row refs, which start unreffing nodes + * when we emit ::row_deleted + */ + gtk_tree_model_row_deleted (GTK_TREE_MODEL (data), path); + + gtk_tree_model_get_iter (GTK_TREE_MODEL (data), &iter, path); + while (elt->ref_count > 0) gtk_tree_model_sort_real_unref_node (GTK_TREE_MODEL (data), &iter, FALSE); @@ -701,13 +709,11 @@ gtk_tree_model_sort_row_deleted (GtkTreeModel *s_model, /* This will prune the level, so I can just emit the signal and not worry * about cleaning this level up. */ gtk_tree_model_sort_increment_stamp (tree_model_sort); - gtk_tree_model_row_deleted (GTK_TREE_MODEL (data), path); gtk_tree_path_free (path); return; } gtk_tree_model_sort_increment_stamp (tree_model_sort); - gtk_tree_model_row_deleted (GTK_TREE_MODEL (data), path); /* Remove the row */ for (i = 0; i < level->array->len; i++) @@ -2141,7 +2147,11 @@ gtk_tree_model_sort_free_level (GtkTreeModelSort *tree_model_sort, static void gtk_tree_model_sort_increment_stamp (GtkTreeModelSort *tree_model_sort) { - while (tree_model_sort->stamp == 0) tree_model_sort->stamp++; + do + { + tree_model_sort->stamp++; + } + while (tree_model_sort->stamp == 0); gtk_tree_model_sort_clear_cache (tree_model_sort); } -- 2.30.2